/* 
* Práctica 2 asignatura Desarrollo Aplicaciones Móviles
*
* /////////////////////////////////////////////////////////////////////////////////////
*
*    -Informática- 
*
* Integrantes:
*
*    Esperanza González de la Mora & Félix López Garcinuño & José Miguel Bilbao Navas 
*/

package com.miaeropuertoplus.damefj.op;

import java.util.Calendar;
import com.miaeropuertoplus.damefj.R;
import com.miaeropuertoplus.damefj.bd.Conexion;
import com.miaeropuertoplus.damefj.bd.Creacion;
import com.miaeropuertoplus.damefj.bd.Sentencias;
import com.miaeropuertoplus.damefj.dp.Depuracion;
import com.miaeropuertoplus.damefj.ms.Mensajes;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;

public class Editar extends Activity {
	
	private Depuracion depeditar=new Depuracion();
    private Mensajes meneditar=new Mensajes();
    private Conexion conexbdeditar=new Conexion();
	private SQLiteDatabase dataeditar;
	private Sentencias sentbdeditar=new Sentencias();
    private String mensaje_error_E;
    private boolean flageditarini=false;
    private long idE;
        
	//Para manejar Date Picker
    private static final int DATE_DIALOG_ID_E = 0; 
    private int mesDPE = 0;
	private int diaDPE = 0;
	private int annoDPE = 0;
	
	//Para manejar la fecha del sistema
	private int mesSYSE = 0;
	private int diaSYSE = 0;
	private int annoSYSE = 0;
	
	//Para manejar datos almacenados
	private String acodaero;
	private String apais;
	private String anotas;
	private int afdia;
	private int afmes;
	private int afanno;
	
	//Para manejar los objetos XML
	private EditText ecodE;
	private EditText epaiE;
	private EditText enotE; 
	private TextView tmosfecE;
		
	@Override
    public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		depeditar.mostrar_log("Editar.java", "Actividad creada");
		Window annadirwin = getWindow();
		annadirwin.requestFeature(Window.FEATURE_RIGHT_ICON); //Decimos que lo requiere antes de visualizarse
		setContentView(R.layout.miaero_editar);//Mostramos xml
		setTitle(R.string.titulo_editar); //Establecemos título [this.setTitle]
		annadirwin.setFeatureDrawableResource(Window.FEATURE_RIGHT_ICON, R.drawable.icon); //Establecemos el icono a mostrar
		
		//Cogemos referencia de los objetos situados en el XML para tratar con ellos
		ecodE=(EditText) findViewById(R.id.editTextCodE);
		epaiE=(EditText) findViewById(R.id.editTextPaiE);
		enotE=(EditText) findViewById(R.id.editTextMultiNotE);
		tmosfecE=(TextView) findViewById(R.id.textViewFecMosE);
        Button bedi=(Button) findViewById(R.id.buttonEdi);
        Button bfecE=(Button)findViewById(R.id.buttonFecE);
	
        /*********************  EVENTOS DE LOS BOTONES  *******************************/

        bfecE.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				showDialog(DATE_DIALOG_ID_E);
			}
		});

        bedi.setOnClickListener(new View.OnClickListener() {
    		public void onClick(View v) {
    			if (validarE())
				{
					guardarDatos();
					meneditar.toastTextoIcono(Editar.this.getApplicationContext(),R.string.actualizado,R.drawable.ok);
					setResult(RESULT_OK);
					finish();
				}
				else meneditar.mostrarDialog(Editar.this, R.string.error_editar, 0, Editar.this.getMensaje_error_E(), Mensajes.DIALOGO_ERROR);
			}
    	});
        
        /******************************************************************************/
        
        /**************VALIDACIONES TEXTVIEW (SOLO SE PUEDEN HACER AQUI)*************/
        
        ecodE.setOnKeyListener(new View.OnKeyListener() {//controlamos introducir de A a Z (sin la Ñ) unicamente en campo COD_AERO
        	public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(event.getAction() == KeyEvent.ACTION_DOWN) {//cuando se pulsa tecla
                	//con las mayusculas devuelve dos valores pero no afecta                          //suprimir                      //volver atras
                     if (((keyCode<KeyEvent.KEYCODE_A) || (keyCode>KeyEvent.KEYCODE_Z)) && (keyCode!=KeyEvent.KEYCODE_DEL)&& (keyCode!=KeyEvent.FLAG_KEEP_TOUCH_MODE)
                    		 && (keyCode!=KeyEvent.KEYCODE_DPAD_LEFT) && (keyCode!=KeyEvent.KEYCODE_DPAD_RIGHT)) //flechas izquierda y derecha
                      	 return true; 
                }      
              return false; //se inserta en EditText
			}
		});
        
        epaiE.setOnKeyListener(new View.OnKeyListener() {//controlamos introducir de A a Z (sin la Ñ) unicamente en campo PAIS
        	public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(event.getAction() == KeyEvent.ACTION_DOWN) {//cuando se pulsa tecla
                	//con las mayusculas devuelve dos valores pero no afecta                          //suprimir                      //volver atras                  
                     if (((keyCode<KeyEvent.KEYCODE_A) || (keyCode>KeyEvent.KEYCODE_Z)) && (keyCode!=KeyEvent.KEYCODE_DEL)&& (keyCode!=KeyEvent.FLAG_KEEP_TOUCH_MODE)
                    		 && (keyCode!=KeyEvent.KEYCODE_DPAD_LEFT) && (keyCode!=KeyEvent.KEYCODE_DPAD_RIGHT) && (keyCode!=KeyEvent.KEYCODE_DPAD_UP) && (keyCode!=KeyEvent.KEYCODE_DPAD_DOWN)
                    		 && (keyCode!=KeyEvent.KEYCODE_SEMICOLON) && (keyCode!=KeyEvent.KEYCODE_SPACE))//flechas, la Ñ (caracter ; mostraria) y espacio   
                     	 return true;                                
                     if (keyCode==KeyEvent.KEYCODE_SEMICOLON){//La Ñ no se añade
                        meneditar.toastTexto(Editar.this.getApplicationContext(), R.string.noene);           	
                      	return true;
                      }
                }
              return false; //se inserta en EditText
			}
		});
        
        enotE.setOnKeyListener(new View.OnKeyListener() {//si introducimos una Ñ en el campo NOTAS
        	public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(event.getAction() == KeyEvent.ACTION_DOWN) {//cuando se pulsa tecla
                	 if (keyCode==KeyEvent.KEYCODE_SEMICOLON){
                		meneditar.toastTexto(Editar.this.getApplicationContext(), R.string.noene);
                      	return true;
                      }
                }
              return false; //se inserta en EditText
			}
		});
       
        /****************************************************************************/
      
      idE=getIntent().getExtras().getLong("ID_PASAR");
      depeditar.mostrar_log("Editar.java", "Recuperamos el id: "+idE);
      //*********Recuperar datos seria habitual aqui
   }//Se sigue en onResume ya que no hay OnStart implementado	
        
	@Override
	public void onResume()
	{
		super.onResume();
		inicializarFechaSYS();  
		  if (!flageditarini) {
			  depeditar.mostrar_log("Editar.java", "Actividad iniciada"); 
			  flageditarini=true;
			  recuperarDatos(Creacion.TABLA);
		  }
		  else{ 
			  depeditar.mostrar_log("Editar.java", "Actividad recupera foco");
			  recuperarDatos(Creacion.TABLAAUX);
		  }
	    updateDatePickerE();
	}	   
	@Override
	public void onRestoreInstanceState(Bundle estadoActivityR) {
	    super.onRestoreInstanceState(estadoActivityR);
	    depeditar.mostrar_log("Editar.java", "Recuperamos estado de la actividad (punteros..");
	    idE=estadoActivityR.getLong("ID_PASAR");
	}//Suele hacer el propio de Android

	@Override
	public void onSaveInstanceState(Bundle estadoActivityS) {
	    super.onSaveInstanceState(estadoActivityS);
	    depeditar.mostrar_log("Editar.java", "Guardamos estado de la actividad (punteros...)");
	    estadoActivityS.putLong("ID_PASAR", idE);
	}

	@Override
	public void onPause()
	{
		super.onPause();
		depeditar.mostrar_log("Editar.java", "Actividad pierde foco");
		salvarDatos();
	}
	    
	@Override
	public void onDestroy()
	{ //Dar a la fecha para salir 
		super.onDestroy();
		depeditar.mostrar_log("Editar.java", "Actividad finalizada");
	}
	
	private void inicializarFechaSYS()
	{
       final Calendar c = Calendar.getInstance();
       annoSYSE = c.get(Calendar.YEAR);
       mesSYSE = c.get(Calendar.MONTH)+1;//el mes va de 0 a 11
       diaSYSE = c.get(Calendar.DAY_OF_MONTH);
    }
	
	/*****************CORRESPONDIENTE A DATE PICKER*****************/		
    
	//actualizamos TextView mostrar fecha seleccionada
	private void updateDatePickerE() {
    	tmosfecE.setText(diaDPE+"/"+mesDPE+"/"+annoDPE);
	}    
	
	//seleccionamos fecha
    private DatePickerDialog.OnDateSetListener dateSetE =
            new DatePickerDialog.OnDateSetListener(){
                public void onDateSet(DatePicker v, int y,int m, int d) {
                    annoDPE = y;
                    mesDPE = m+1; //mes del año
                    diaDPE = d; //dia del mes
                    updateDatePickerE();
                }
    };
	
	@Override
	protected Dialog onCreateDialog(int id)	{
		  if (id==DATE_DIALOG_ID_E) return new DatePickerDialog(this,dateSetE,annoDPE, mesDPE-1, diaDPE);//Se resta uno porque muestra siguiente mes
		return null;
	}		    

    /************************************************************/

	private boolean validarE()
		{
			depeditar.mostrar_log("Editar.java","Entramos a validar");
			Editar.this.setMensaje_error_E("");
			boolean existenD=false;
			String ecodTextoE=ecodE.getText().toString().toUpperCase();
			
			//1-Comprobacion datos vacios
    			if (ecodE==null || ecodTextoE.equals("")) Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● CÓDIGO vacío\n");
		    	if (epaiE==null || epaiE.getText().toString().trim().equals("")) Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● PAÍS vacío\n");
			    if (tmosfecE==null || tmosfecE.getText().toString().equals("")) Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● FECHA no seleccionada\n");
			   
			//2-Longitud del codigo aeropuerto sea 3 
			    if ((ecodTextoE.length()) < 3) Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● CÓDIGO longitud inválida\n");
			
			//3-Fecha introducida no sea anterior a la actual
			    if(annoDPE==annoSYSE)
			    {
				    if (mesDPE==mesSYSE)
				    {   
				      if (diaDPE<diaSYSE)    Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● FECHA anterior actual\n");
				    }
				    else if (mesDPE<mesSYSE) Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● FECHA anterior actual\n");
			    }
				else if (annoDPE<annoSYSE)   Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● FECHA anterior actual\n");  
			 
			//4-Datos (salvo pais y notas) no esten insertados en otro lugar de la tabla
			    dataeditar=conexbdeditar.AbrirBDLectura(Editar.this);
			       if (!(ecodTextoE.equals(acodaero)) || diaDPE!=afdia || mesDPE!=afmes || annoDPE!=afanno)
			       {	   
				      existenD=sentbdeditar.existenDatosInsertados(dataeditar, ecodTextoE.toUpperCase(),diaDPE,mesDPE,annoDPE);
				         if (existenD) Editar.this.setMensaje_error_E(Editar.this.getMensaje_error_E()+"\n\t ● DATOS INSERTADOS EN\n\t\t OTRO DESTINO\n\n\t\t Código IATA y fecha\n");
			       }
				conexbdeditar.CerrarBD();    
		     	   if (Editar.this.getMensaje_error_E().equals("")) return true; //Datos válidos
            return false; 
		}		
		
		public String getMensaje_error_E() {
	   	    return mensaje_error_E;
	    }

	    public void setMensaje_error_E(String mensaje_error) {
			this.mensaje_error_E = mensaje_error;
	    }

	    public void recuperarDatos(String tabla){
	    	dataeditar=conexbdeditar.AbrirBDLectura(Editar.this);
	    	Cursor datosobid;
			    if (tabla.equals(Creacion.TABLA)) datosobid = sentbdeditar.obtenerDatosId(tabla,dataeditar,idE);
			    else datosobid = sentbdeditar.obtenerDatosId(tabla,dataeditar,1); //tabla auxiliar 
		    startManagingCursor(datosobid);
            acodaero=datosobid.getString(datosobid.getColumnIndexOrThrow(Sentencias.CAMPO_COD));//getstring(1);
            apais=datosobid.getString(datosobid.getColumnIndexOrThrow(Sentencias.CAMPO_PAIS));
            afdia=datosobid.getInt(datosobid.getColumnIndexOrThrow(Sentencias.CAMPO_FECHAD));
            afmes=datosobid.getInt(datosobid.getColumnIndexOrThrow(Sentencias.CAMPO_FECHAM));
            afanno=datosobid.getInt(datosobid.getColumnIndexOrThrow(Sentencias.CAMPO_FECHAY));
            anotas=datosobid.getString(datosobid.getColumnIndexOrThrow(Sentencias.CAMPO_NOTAS));
            diaDPE=afdia;mesDPE=afmes;annoDPE=afanno;
        	ecodE.setText(acodaero);epaiE.setText(apais);enotE.setText(anotas);
            stopManagingCursor(datosobid);
			conexbdeditar.CerrarBD();
			depeditar.mostrar_log("Editar.java", "Datos recuperados desde la base de datos auxiliar");
	    }
	    
	    public void salvarDatos(){
	    	dataeditar=conexbdeditar.AbrirBDEscritura(Editar.this);
			sentbdeditar.insertarDatos(Creacion.TABLAAUX, dataeditar,ecodE.getText().toString().toUpperCase(), epaiE.getText().toString().trim(),diaDPE,mesDPE,annoDPE,enotE.getText().toString());
			conexbdeditar.CerrarBD();
	    	depeditar.mostrar_log("Editar.java", "Datos salvados en la base de datos auxiliar");
	    }
	    
	    public void guardarDatos(){
	    	dataeditar=conexbdeditar.AbrirBDEscritura(Editar.this);
			sentbdeditar.actualizarDato(dataeditar,idE, ecodE.getText().toString().toUpperCase(), epaiE.getText().toString().trim(),diaDPE,mesDPE,annoDPE,enotE.getText().toString());
			conexbdeditar.CerrarBD();
	    	depeditar.mostrar_log("Editar.java", "Datos guardados en la base de datos");
	    }
}